package com.zfl.remove;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class Main {
    public static void main(String[] args) throws InterruptedException {
        UserPool pool = new UserPool();

        // 2. 创建定时线程池：核心线程数1（清理任务单线程足够）
        // ScheduledExecutorService是专门用于执行定时/周期性任务的线程池
        ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(1);

        // 3. 配置定时任务：每隔10秒执行一次清理，首次执行延迟0秒（立即开始）
        long initialDelay = 0;          // 首次执行延迟（0秒=立即执行）
        long period = 10 * 1000;        // 执行周期（10秒）
        long timeoutMs = 7* 60 * 1000; // 超时阈值（5分钟）

        scheduledThreadPool.scheduleAtFixedRate(
                ()->pool.cleanTimeoutUsers(timeoutMs),
                initialDelay,
                period,
                TimeUnit.MILLISECONDS
        );

        // 4. 模拟用户登录（主线程操作）
        pool.addUser(new UserNode("1001"));
        Thread.sleep(2000); // 间隔2秒
        pool.addUser(new UserNode("1002"));
        Thread.sleep(2000);
        pool.addUser(new UserNode("1003"));

        // 5. 模拟系统运行30秒（期间线程池会自动执行清理任务）
        System.out.println("\n系统运行中...（30秒后模拟用户登出）");
        Thread.sleep(10 * 1000);

        // 6. 模拟用户主动登出
        pool.removeUser("1001");

        // 7. 再运行10秒，观察后续清理效果
        Thread.sleep(10*1000);

        // 8. 优雅关闭线程池：先停止接收新任务，等待已提交任务执行完（最多等待5秒）
        System.out.println("\n准备关闭程序，正在停止线程池...");
        scheduledThreadPool.shutdown(); // 关闭线程池，不中断正在执行的任务
        // 等待线程池关闭，超时则强制关闭
        if (!scheduledThreadPool.awaitTermination(5, TimeUnit.SECONDS)) {
            scheduledThreadPool.shutdownNow(); // 强制中断未完成的任务
        }

        // 9. 输出最终结果
        System.out.println("程序结束，最终在线人数：" + pool.getOnlineUserCount());
    }
}
